package com.voodoo.lib_frame.toast;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.hjq.xtoast.XToast;
import com.voodoo.lib_frame.R;

/**
 * Author: voodoo
 * CreateDate: 2021/05/18
 * Description: 图片Toast
 * <p>
 * 距底部 193dp
 * <p>showXToast(activity, toastMsg, duration, clickListener) 无图指定时长的Toast，带点击事件
 * <p>showXToast(activity, toastMsg, duration) 无图指定时长的Toast，不带点击事件
 * <p>showXToast(activity, toastMsg, clickListener) 无图默认时长的Toast，带点击事件
 * <p>showXToast(activity, toastMsg) 无图默认时长的Toast，不带点击事件
 * <p><br>
 * <p>showXToast(activity, toastImageResId, toastMsg, duration) 有图指定时长的Toast
 * <p>showXToast(activity, toastImageResId, toastMsg, clickListener) 有图默认时长的Toast，带点击事件
 * <p>showXToast(activity, toastImageResId, toastMsg) 有图默认时长的Toast
 * <p>showXToast(activity, toastImageResId, toastMsg, duration, clickListener) 有图指定时长，带点击事件
 */
public class Toast {

    static XToast toast;
    static int DEFAULT_DURATION = 2500; // 默认展示时长

    // ============================================================================= 不带图片的Toast

    /**
     * 无图指定时长的Toast，带点击事件
     *
     * @param activity      传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                      传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastMsg      传入的提示消息
     * @param duration      指定时长
     * @param clickListener 点击事件
     */
    public static void showXToast(Activity activity, String toastMsg, int duration, View.OnClickListener clickListener) {
        showXToast(activity, 0, toastMsg, duration, clickListener);
    }

    /**
     * 无图指定时长的Toast，不带点击事件
     *
     * @param activity 传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                 传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastMsg 传入的提示消息
     * @param duration 指定时长
     */
    public static void showXToast(Activity activity, String toastMsg, int duration) {
        showXToast(activity, 0, toastMsg, duration, null);
    }

    /**
     * 无图默认时长的Toast，带点击事件
     *
     * @param activity      传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                      传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastMsg      传入的提示消息
     * @param clickListener 点击事件
     */
    public static void showXToast(Activity activity, String
            toastMsg, View.OnClickListener clickListener) {
        showXToast(activity, 0, toastMsg, DEFAULT_DURATION, clickListener);
    }

    /**
     * 无图默认时长的Toast，不带点击事件
     *
     * @param activity 传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                 传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastMsg 传入的提示消息
     */
    public static void showXToast(Activity activity, String toastMsg) {
        showXToast(activity, 0, toastMsg, DEFAULT_DURATION, null);
    }

    // =============================================================================== 带图片的Toast

    /**
     * 有图指定时长的Toast
     *
     * @param activity        activity 传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                        传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastImageResId 展示的图片id
     * @param toastMsg        传入的提示消息
     * @param duration        指定时长
     */
    public static void showXToast(Activity activity, int toastImageResId, String toastMsg, int duration) {
        showXToast(activity, toastImageResId, toastMsg, duration, null);
    }

    /**
     * 有图默认时长的Toast，带点击事件
     *
     * @param activity        activity 传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                        传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastImageResId 展示的图片id
     * @param toastMsg        传入的提示消息
     * @param clickListener   点击事件
     */
    public static void showXToast(Activity activity, int toastImageResId, String
            toastMsg, View.OnClickListener clickListener) {
        showXToast(activity, toastImageResId, toastMsg, DEFAULT_DURATION, clickListener);
    }

    /**
     * 有图默认时长的Toast
     *
     * @param activity        activity 传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                        传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastImageResId 展示的图片id
     * @param toastMsg        展示的消息
     */
    public static void showXToast(Activity activity, int toastImageResId, String
            toastMsg) {
        showXToast(activity, toastImageResId, toastMsg, DEFAULT_DURATION, null);
    }

    // =========================================================================== 实际展示Toast方法

    /**
     * 展示Toast弹窗提示
     *
     * @param activity        传入 Activity 对象表示设置成局部的，不需要有悬浮窗权限
     *                        传入 Application 对象表示设置成全局的，但需要有悬浮窗权限
     * @param toastImageResId 展示的图片id 如果不展示ImageView，则传入<=0的值
     * @param toastMsg        展示的提示信息字符串或资源ID
     * @param duration        显示的时长 如果时长小于1.5秒，则最少展示2秒
     * @param clickListener   点击事件，若不需要点击事件则传入null
     */
    public static void showXToast(Activity activity, int toastImageResId, String toastMsg, int duration, final View.OnClickListener clickListener) {
        // 获取展示的View并设置各个控件的值
        View toastView = LayoutInflater.from(activity).inflate(R.layout.view_toast_layout, null);
        ImageView toastImgv = toastView.findViewById(R.id.viewToast_img_imgv);
        TextView msgTv = toastView.findViewById(R.id.viewToast_msg_tv);
        if (toastImageResId <= 0) {
            toastImgv.setVisibility(View.GONE);

//            // 底部对齐并设置底边距 TODO params返回null
//            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) toastView.getLayoutParams();
//            params.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
//            params.bottomMargin = 190;
//            toastView.setLayoutParams(params);

        } else {
            toastImgv.setImageDrawable(activity.getResources().getDrawable(toastImageResId));
        }
        msgTv.setText(toastMsg);

        // 如果Toast不为空并且Toast展示中，则取消展示
        if (toast != null && toast.isShow()) {
            toast.cancel();
        }

        // 创建新Toast并展示
        toast = new XToast<>(activity)
                // 设置展示的布局
                .setView(toastView)
                // 设置显示时长
                .setDuration(duration < 1500 ? 2000 : duration)
//                // 设置外层是否能被触摸
//                .setOutsideTouchable(false)
                // 设置窗口背景阴影强度
//                .setBackgroundDimAmount(0.5f)
                // 设置动画样式
//                      Animation_Activity 突然显示
//                      Animation_Dialog 弹出展示
//                      Animation_InputMethod 键盘弹出试
//                      Animation_Toast 淡入淡出
//                      Animation_Translucent 右侧平移
                .setAnimStyle(android.R.style.Animation_Toast);
        // 设置View的Click事件监听
        if (clickListener != null) {
            toast.setOnClickListener(new XToast.OnClickListener<View>() {
                @Override
                public void onClick(XToast<?> toast, View view) {
                    clickListener.onClick(view);
                    toast.cancel();
                }
            });
        }

        toast.setWidth(800);
        toast.setHeight(440);
        toast.show();
    }

}
